package cn.iocoder.yudao.module.datasource.service.example;

import cn.iocoder.yudao.module.datasource.service.config.DataSourceSwitchService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 数据源使用示例服务
 * 演示如何在业务代码中使用动态数据源切换功能
 *
 * @author 芋道源码
 */
@Service
@Slf4j
public class DataSourceUsageExampleService {

    @Autowired
    private DataSourceSwitchService dataSourceSwitchService;

    @Autowired(required = false)
    private JdbcTemplate jdbcTemplate;

    /**
     * 示例1：切换到指定数据源执行查询
     */
    public List<Map<String, Object>> queryFromSpecificDataSource(Long dataSourceId, String sql) {
        try {
            // 切换到指定数据源
            dataSourceSwitchService.switchTo(dataSourceId);
            log.info("已切换到数据源: {}", dataSourceId);

            // 执行查询
            List<Map<String, Object>> results = jdbcTemplate.queryForList(sql);
            log.info("查询结果数量: {}", results.size());

            return results;

        } catch (Exception e) {
            log.error("查询失败", e);
            throw e;
        } finally {
            // 确保切换回默认数据源
            dataSourceSwitchService.switchToDefault();
            log.info("已切换回默认数据源");
        }
    }

    /**
     * 示例2：在多个数据源间进行数据同步
     */
    public void syncDataBetweenDataSources(Long sourceDataSourceId, Long targetDataSourceId) {
        List<Map<String, Object>> sourceData;

        try {
            // 从源数据源读取数据
            dataSourceSwitchService.switchTo(sourceDataSourceId);
            log.info("从源数据源读取数据: {}", sourceDataSourceId);

            sourceData = jdbcTemplate.queryForList("SELECT * FROM sync_table WHERE status = 1");
            log.info("读取到 {} 条记录", sourceData.size());

            // 切换到目标数据源
            dataSourceSwitchService.switchTo(targetDataSourceId);
            log.info("切换到目标数据源: {}", targetDataSourceId);

            // 同步数据
            for (Map<String, Object> record : sourceData) {
                // 这里演示简单的插入操作，实际应用中需要根据业务逻辑处理
                String insertSql = "INSERT INTO sync_table (id, name, status) VALUES (?, ?, ?)";
                jdbcTemplate.update(insertSql, 
                    record.get("id"), 
                    record.get("name"), 
                    record.get("status"));
            }

            log.info("数据同步完成");

        } catch (Exception e) {
            log.error("数据同步失败", e);
            throw e;
        } finally {
            dataSourceSwitchService.switchToDefault();
        }
    }

    /**
     * 示例3：多租户数据查询
     */
    public List<Map<String, Object>> queryTenantData(Long tenantId, String tableName) {
        // 假设每个租户对应一个数据源，数据源ID等于租户ID
        Long dataSourceId = tenantId;

        try {
            // 切换到租户对应的数据源
            dataSourceSwitchService.switchTo(dataSourceId);
            log.info("切换到租户 {} 的数据源", tenantId);

            // 执行租户数据查询
            String sql = String.format("SELECT * FROM %s WHERE tenant_id = ?", tableName);
            List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, tenantId);
            
            log.info("租户 {} 查询到 {} 条记录", tenantId, results.size());
            return results;

        } catch (Exception e) {
            log.error("租户数据查询失败, tenantId: {}", tenantId, e);
            throw e;
        } finally {
            dataSourceSwitchService.switchToDefault();
        }
    }

    /**
     * 示例4：数据库健康检查
     */
    public boolean checkDataSourceHealth(Long dataSourceId) {
        try {
            dataSourceSwitchService.switchTo(dataSourceId);
            
            // 执行简单的健康检查查询
            Integer result = jdbcTemplate.queryForObject("SELECT 1", Integer.class);
            
            boolean isHealthy = result != null && result == 1;
            log.info("数据源 {} 健康检查结果: {}", dataSourceId, isHealthy ? "正常" : "异常");
            
            return isHealthy;

        } catch (Exception e) {
            log.error("数据源 {} 健康检查失败", dataSourceId, e);
            return false;
        } finally {
            dataSourceSwitchService.switchToDefault();
        }
    }

    /**
     * 示例5：获取当前使用的数据源信息
     */
    public String getCurrentDataSourceInfo() {
        String currentDataSource = dataSourceSwitchService.getCurrentDataSource();
        
        if (currentDataSource == null) {
            return "当前使用默认数据源";
        } else {
            return "当前使用数据源ID: " + currentDataSource;
        }
    }
}